package com.siwei.apply.service.impl;

import com.siwei.apply.domain.Gyjsydjfwscdj;
import com.siwei.apply.domain.Project;
import com.siwei.apply.domain.res.GyjsydjfwscdjRes;
import com.siwei.apply.domain.res.GyjsydjfwscdjSinglRes;
import com.siwei.apply.domain.vo.GyjsydjfwscdjUpdateVo;
import com.siwei.apply.domain.vo.GyjsydjfwscdjVo;
import com.siwei.apply.mapper.GyjsydjfwscdjMapper;
import com.siwei.apply.mapper.ProjectMapper;
import com.siwei.apply.service.GyjsydjfwscdjService;
import com.siwei.common.core.utils.bean.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import static com.siwei.apply.common.Common.UserId;

// 新增导入：项目流程相关
import org.springframework.transaction.annotation.Transactional;
import com.siwei.apply.domain.ProjectWorkflow;
import com.siwei.apply.domain.Workflow;
import com.siwei.apply.mapper.ProjectWorkflowMapper;
import com.siwei.apply.mapper.WorkflowMapper;
import java.util.List;

/**
 * 国有建设用地使用权及房屋所有权首次登记 服务实现类
 */
@Service
public class Gyjsydjfwscdjmpl implements GyjsydjfwscdjService {
    @Autowired
    private GyjsydjfwscdjMapper gyjsydjfwscdjMapper;
    @Autowired
    private ProjectMapper projectMapper;
    // 新增：项目流程相关Mapper
    @Autowired
    private ProjectWorkflowMapper projectWorkflowMapper;
    @Autowired
    private WorkflowMapper workflowMapper;

    @Override
    public Boolean isExit(String projectId) {
        return gyjsydjfwscdjMapper.isExit(projectId);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public String add(GyjsydjfwscdjVo gyjsydjfwscdjVo) {
        Gyjsydjfwscdj gyjsydjfwscdj = new Gyjsydjfwscdj();
        BeanUtils.copyProperties(gyjsydjfwscdjVo, gyjsydjfwscdj);
        gyjsydjfwscdj.generateId();
        gyjsydjfwscdj.setCreatorId(UserId);
        gyjsydjfwscdjMapper.add(gyjsydjfwscdj);
        // 添加项目流程（仿照YdbpImpl）
        Integer projectType = projectMapper.getProjectTypeById(gyjsydjfwscdj.getProjectId());
        Workflow workflow = workflowMapper.selectByProjectTypeAndTableName(projectType, "t_gyjsydjfwscdj");
        Workflow workflowPrev = workflowMapper.selectPrevByProjectTypeAndTableName(projectType, "t_gyjsydjfwscdj");
        String parentId = "";
        if (workflowPrev != null) {
            List<ProjectWorkflow> projectWorkflows = projectWorkflowMapper.selectByProjectIdAndNodeTableName(gyjsydjfwscdj.getProjectId(), workflowPrev.getTableName());
            if (projectWorkflows != null && !projectWorkflows.isEmpty()) {
                parentId = projectWorkflows.get(0).getNodeId();
            }
        }
        ProjectWorkflow projectWorkflow = new ProjectWorkflow();
        projectWorkflow.setId(gyjsydjfwscdj.getId());
        projectWorkflow.setParentId(parentId);
        projectWorkflow.setWorkflowId(workflow.getId());
        projectWorkflow.setProjectId(gyjsydjfwscdj.getProjectId());
        projectWorkflow.setNodeId(gyjsydjfwscdj.getId());
        projectWorkflow.setNodeTableName(workflow.getTableName());
        projectWorkflow.setWorkflowName(workflow.getName());
        projectWorkflowMapper.add(projectWorkflow);
        return gyjsydjfwscdj.getId();
    }

    @Override
    public GyjsydjfwscdjRes get(String projectId) {
        List<Gyjsydjfwscdj> list = gyjsydjfwscdjMapper.get(projectId);
        Project project = projectMapper.get(projectId);

        GyjsydjfwscdjRes res = new GyjsydjfwscdjRes();
        res.setProjectId(projectId);
        if (project != null) {
            res.setProjectName(project.getName());
            res.setProjectCode(project.getCode());
        }
        res.setGyjsydjfwscdjList(list);
        return res;
    }

    @Override
    public GyjsydjfwscdjSinglRes getById(String id) {
        Gyjsydjfwscdj item = gyjsydjfwscdjMapper.getById(id);
        if (item == null) {
            return null;
        }
        Project project = projectMapper.get(item.getProjectId());
        GyjsydjfwscdjSinglRes res = new GyjsydjfwscdjSinglRes();
        BeanUtils.copyProperties(item, res);
        if (project != null) {
            res.setProjectName(project.getName());
            res.setProjectCode(project.getCode());
        }
        return res;
    }

    @Override
    public void update(GyjsydjfwscdjUpdateVo gyjsydjfwscdjUpdateVo) {
        gyjsydjfwscdjMapper.update(gyjsydjfwscdjUpdateVo);
    }

    @Override
    public void updateHasOnchain(String id, Boolean hasOnchain) {
        gyjsydjfwscdjMapper.updateHasOnchain(id, hasOnchain);
    }
}
